package com.tanhua.dubbo.server.api;

import com.alibaba.dubbo.config.annotation.Service;
import com.tanhua.common.pojo.RecommendUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import java.util.ArrayList;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 *
 * @ClassName: RecommendUserApiImpl
 * @Author:王晨晗
 * @Description: recommend_user的相关服务
 * @Date: 2021/12/28/18:58
 */
@Service
public class RecommendUserApiImpl  implements  RecommendUserApi{
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    private UserLikeApi userLikeApi;

    /**
     * @description 根据用户id查询缘分值最大的佳人信息
     * @param userId
     * @updateTime 2021/12/28 18:56
     * @return: com.tanhua.common.pojo.RecommendUser
     */
    @Override
    public RecommendUser queryWithMaxScore(Long userId) {
        //定义查询条件,根据当前登录的用户id , 查询推荐表中与其缘分值最高的用户
        Query query = Query.query(Criteria.where("toUserId").is(userId)).with(Sort.by(Sort.Order.desc("score"))).limit(1);
        //根据条件查询,获取推荐信息
        RecommendUser recommendUser = mongoTemplate.findOne(query, RecommendUser.class);
        return recommendUser;
    }

    /**
     * @description
     * @param id  当前用户id
     * @param userIds  推荐用户id(符合条件的id)
     * @param page  当前页
     * @param pageSize  每页显示条数
     * @updateTime 2021/12/28 23:25
     * @return: java.util.List<com.tanhua.common.pojo.RecommendUser>
     */
    @Override
    public List<RecommendUser> queryRecommendation(Long id , List<Object> userIds , Integer page , Integer pageSize) {
        //获取总条数
        Query query1 = Query.query(Criteria.where("UserId").in(userIds).and("toUserId").is(id));
        int size = mongoTemplate.find(query1, RecommendUser.class).size();

        if ((size%pageSize== 0 ? size/pageSize : size/pageSize + 1) < page){
            page = 1;
        }

        //定义分页条件
        PageRequest pageRequest = PageRequest.of(page-1 , pageSize,Sort.by(Sort.Order.desc("score")));
        //定义查询条件,根据推荐的所有用户UserId是否在符合条件的UserIds中并且满足id是当前登录的用户id 查询推荐表中的用户
        Query query = Query.query(Criteria.where("UserId").in(userIds).and("toUserId").is(id)).with(pageRequest);
        //查询数据,返回推荐表信息实体对象的list集合
        List<RecommendUser> recommendUsers = mongoTemplate.find(query, RecommendUser.class);

        if (recommendUsers.size() > 0){
            recommendUsers.get(0).setToUserId((long) size);
        }
        return recommendUsers;
    }


    /**
     * @description
     * @param id  当前用户id
     * @param page  当前页
     * @param pageSize  每页显示条数
     * @updateTime 2021/12/28 23:25
     * @return: java.util.List<com.tanhua.common.pojo.RecommendUser>
     */
    @Override
    public List<RecommendUser> queryRecommendation1(Long id , Integer page , Integer pageSize) {
        //定义分页条件
        PageRequest pageRequest = PageRequest.of(page-1 , pageSize,Sort.by(Sort.Order.desc("score")));
        //定义查询条件,根据推荐的所有用户UserId是否在符合条件的UserIds中并且满足id是当前登录的用户id 查询推荐表中的用户
        Query query = Query.query(Criteria.where("toUserId").is(id)).with(pageRequest);
        //查询数据,返回推荐表信息实体对象的list集合
        List<RecommendUser> recommendUsers = mongoTemplate.find(query, RecommendUser.class);

        return recommendUsers;
    }

    /**
     * @description 查询与好友的好感值
     * @param userId
     * @param toUserId
     * @return
     */
    @Override
    public Double queryScore(Long userId, Long toUserId) {
        //构建查询条件
        Query query = Query.query(Criteria.where("toUserId").is(toUserId).and("userId").is(userId));
        RecommendUser recommendUser = mongoTemplate.findOne(query, RecommendUser.class);
        //判断查询结果是否为空
        if (null != recommendUser){
            return recommendUser.getScore();        //不为空 返回缘分值
        }
        //为空, 返回null
        return null;
    }

    /**
     * @description 查询探花卡片列表
     * @param userId
     * @param count
     * @return
     */
    @Override
    public List<RecommendUser> queryCardList(Long userId, Integer count) {
        //设置分页以及排序 ,按照得分倒序排序
        PageRequest pageRequest = PageRequest.of(0 , count , Sort.by(Sort.Order.desc("score")));
        //排除已喜欢或不喜欢的用户
        List<Long> userIds = new ArrayList<>();
        userIds.addAll(userLikeApi.queryLikeList(userId));      //喜欢列表
        userIds.addAll(userLikeApi.queryNotLikeList(userId));   //不喜欢列表
        //构建查询条件
        Query query = Query.query(Criteria.where("toUserId").is(userId).and("userId").nin(userIds)).with(pageRequest);
        List<RecommendUser> recommendUserList = mongoTemplate.find(query, RecommendUser.class);
        //返回推荐的用户列表
        return recommendUserList;
    }
}
